//第一种方法
void Timer0_Init()        //定时器0的初始化
{
    TMOD=0x01;     //将TMOD寄存器的八位置为0000 0001，采用十六进制为0x01。
    TF0=0;         //将TCON寄存器中的TF0位置于0，使定时器T0开始从初值加1计数。
	TR0=1;         //TR0=1时允许T0进行计数，TR0=0时禁止T0进行计数。
	TH0=64535/256;    //高位取模，低位取余，这里定时器的初值为64535us，最高为64535us，相当于能定时1000us=1ms
	TL0=64535%256;
	ET0=1;                
	EA=1;
	PT0=0;
}

unit T0count;     //额外定义一个变量用于在定时器中断的时候重新恢复初值开始计数，全局变量
void Timer_Routine() interrupt 1      //interrupt 1是一个标志，定时器在记满时间之后会自动触发此函数
{
	TH0=65435/256;                //因为定时器中断以后要重新赋值，就像沙漏要记录比自身完全漏完总时间长的的时间需要重新倒过来一样。
	TL0=65435%256; 
	T0count++;                   //每记录完1000us=1ms时，T0count就会自动+1
	if(T0count>=1000)            //当T0count加到1000时，相当于记录了1000*1ms=1s，此时定时器相当于记录了1s
	{
		T0count=0;               //T0count重新置0
		P2_0=~P2_0;              //控制LED灯亮灭，亮就灭，灭就亮，按位取反。
	}
}

//第二种方法，来自STC.isp
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}


void Timer_Routine() interrupt 1      //interrupt 1是一个标志，定时器在记满时间之后会自动触发此函数
{
    static unsigned int T0count; //静态局部变量，作用是保持T0count的值不变
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	T0count++;                   //每记录完1000us=1ms时，T0count就会自动+1
	if(T0count>=1000)            //当T0count加到1000时，相当于记录了1000*1ms=1s，此时定时器相当于记录了1s
	{
		T0count=0;               //T0count重新置0
		P2_0=~P2_0;              //控制LED灯亮灭，亮就灭，灭就亮，按位取反。
	}
}


